上偏我們簡單介紹到了如何使用Etherscan來瀏覽以太坊上所有的交易紀錄與錢包地址,以及上傳智能合約時編譯與驗證的小知識。今天就讓我們繼續以BAYC的合約來進行研究認識吧!
在我們正式開始研究BAYC的合約前,我們並須先弄懂以太坊基金會所規定的代幣標準,這邊就直接以ERC721為例!也就是大家最常用來發行NFT的標準。
首先直接進入ERC721代幣標準的官方說明頁面,我們可以看到文件中提到,ERC-721標準是在2018年一月正式上架的,並提到若要符合該標準,必須擁有像是把此代幣傳送至另一個錢包、得到某個錢包的餘額、查看其中某個代幣的持有者以及設定此代幣的總數等函式...
詳細需要的Methods以及Events如下:
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
若此代幣符合以上標準,也就是擁有上面規定的Methods函式
及Events事件
,則可以被歸類成ERC-721的代幣。
讓我們回到BAYC的合約吧! 大家先粗略的翻閱一下
總共2021行的程式碼好像有點多 這其中有什麼祕密嗎?
其實有,大家有發現嗎? 整個程式碼似乎是由很多個區組成起來的欸! 而且前面一定都會先有註解語法File: @openzeppelin/..
,然後銜接pragma solidity >=0.x.0;
,這些到底是什麼意思啊??
猜到了嗎?,其實pragma solidity >=0.6.0 <0.8.0
代表著Solidity語言的版本號,而0.6.0 <0.8.0
就代表著大家在編譯輸出的時候必須用0.6.0~0.8.0的版本跑才不會出問題。而開頭註解提到的File: @openzeppelin/..
其時就是在表明這段code是引用別人的,透過註解表明出處並直接複製貼上使用。
不過這樣算下來...,好像從第1895行後才是自己寫的欸,前面都是直接引用他人寫好的Library做使用,這個Openzeppelin到底是何方神聖阿? 怎麼都引用他的函式庫呢?
前面有提到以太坊基金會對於代幣模型是有一套標準的,像ERC-20、ERC-721、ERC-1155...等,都需要有特定的函式才會被認可,而這些函式像查看對方的錢包餘額、轉代幣給對方等,都非常的基礎但又重要,哪怕是有一點打錯都可能造成安全性上的問題。用個簡單的數學例子比喻: 假設以太坊基金會規定新的ERC-123代幣,都必須擁有"平方"函式才算合格,而其中"平方"這個函式大家要怎麼處理、運算則會有各自不同的解。而這時候就是OpenZeppelin出場的時候了,透過開源及所有人都可以共同維護的方式,提供了各種代幣標準所需的函式,並具備了持續更新、安全、快速的特性。這樣對於合約作者來說節省了開發時間,對於閱讀者也節省了驗證正確性的時間,可以達到快速信任的效果,可以說是雙贏。關於怎麼使用這個Library,未來開發的時候我們在詳細介紹!
(OpenZeppelin快速開發頁面,除了提供代幣標準的函式,更提供了常見的NFT函式)
--
今天跟大家介紹了ERC721標準以及OpenZeppelin強大的Library,其實BAYC猴子的合約有90%都是引用別人的函式庫而已喔!明天讓我們真正來開始看合約吧!
<上一篇> [Day 19] 從BAYC猴子的智能合約 看懂背後運作原理(一)Etherscan
<下一篇> [Day 21] 從BAYC猴子的智能合約 看懂背後運作原理(三)其實BAYC的合約有漏洞!
參考資料: